function numerical_root_finding()
    % 求解第一个方程
    fprintf('\n求解方程 ln(x + sin x) = 0:\n');
    f1 = @(x) log(x + sin(x));
    df1 = @(x) 1/(x + sin(x)) * (1 + cos(x));
    x0_array1 = [0.1, 1, 1.5, 2, 4];
    solve_equation(f1, df1, x0_array1, '第一个方程');
    
    % 求解第二个方程
    fprintf('\n求解方程 sin x = 0:\n');
    f2 = @(x) sin(x);
    df2 = @(x) cos(x);
    x0_array2 = [1, 1.4, 1.6, 1.8, 3];
    solve_equation(f2, df2, x0_array2, '第二个方程');
end

function solve_equation(f, df, x0_array, equation_name)
    % 参数设置
    tol = 1e-6;         % 容差
    max_iter = 20;      % 减小最大迭代次数
    
    % 输出表头
    fprintf('初始值\t牛顿法结果\t迭代次数\tSteffensen法结果\t迭代次数\n');
    
    % 对每个初始值进行计算
    for x0 = x0_array
        try
            [xn, itern, flag_n] = newton_method(f, df, x0, tol, max_iter);
            [xs, iters, flag_s] = steffensen_method(f, x0, tol, max_iter);
            
            % 根据计算结果标志输出不同格式
            if flag_n && flag_s
                fprintf('%.1f\t%.6f\t%d\t%.6f\t%d\n', x0, xn, itern, xs, iters);
            elseif flag_n
                fprintf('%.1f\t%.6f\t%d\tSteffensen法未收敛\t-\n', x0, xn, itern);
            elseif flag_s
                fprintf('%.1f\t牛顿法未收敛\t-\t%.6f\t%d\n', x0, xs, iters);
            else
                fprintf('%.1f\t两种方法均未收敛\t-\t-\t-\n', x0);
            end
        catch ME
            fprintf('%.1f\t计算失败: %s\n', x0, ME.message);
        end
    end
end

function [x, iter, flag] = newton_method(f, df, x0, tol, max_iter)
    x = x0;
    iter = 0;
    flag = false;  % 收敛标志
    
    while iter < max_iter
        fx = f(x);
        dfx = df(x);
        
        % 检查导数是否太小
        if abs(dfx) < 1e-10
            error('导数太接近0，可能在驻点附近');
        end
        
        % 计算新的迭代点
        x_new = x - fx/dfx;
        
        % 检查是否发散
        if abs(x_new) > 1e6
            error('迭代发散');
        end
        
        % 收敛性检查
        if abs(x_new - x) < tol && abs(fx) < tol
            x = x_new;
            flag = true;
            return;
        end
        
        x = x_new;
        iter = iter + 1;
    end
end

function [x, iter, flag] = steffensen_method(f, x0, tol, max_iter)
    x = x0;
    iter = 0;
    flag = false;  % 收敛标志
    
    while iter < max_iter
        fx = f(x);
        
        % 如果函数值已经很小，认为找到了解
        if abs(fx) < tol
            flag = true;
            return;
        end
        
        fpx = f(x + fx);
        
        % 检查分母是否太小
        if abs(fpx - fx) < 1e-10
            error('迭代过程中除数太小');
        end
        
        % 计算新的迭代点
        x_new = x - fx*fx/(fpx - fx);
        
        % 检查是否发散
        if abs(x_new) > 1e6
            error('迭代发散');
        end
        
        % 收敛性检查
        if abs(x_new - x) < tol && abs(f(x_new)) < tol
            x = x_new;
            flag = true;
            return;
        end
        
        x = x_new;
        iter = iter + 1;
    end
end